package com.tedu.api.socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 网络通讯----Socket【套接字】 理解:互联网型java类
 *
 * 网络应用遵循原则：
 * C/S架构   Client  客户端    Server  服务器    早期应用【手机app---手机应用】
 * JavaSE   桌面升级---java并不擅长
 *
 * B/S架构 Browser  浏览器端   Server  服务端    后期应用【后台语言】
 * JavaSE  做逻辑    Mysql   保存数据     Web---Java管理后台
 *
 * 客户端 类：Client---->网络通讯  Socket
 * 服务器端 类：Server---->网络通讯  ServerSocket
 *
 * 网络通讯 ServerSocket、Socket---底层传输协议支持两种：
 * TCP协议：可靠性好传输协议，基于字节流--传输低，安全高【√传数据】
 * UDP协议：不可靠传输协议，基于数据报--传输高，安全低【游戏】
 * 以上两种协议，封装底层代码中
 *
 * 需求1:通过IP+端口   别人连接上自己   互相建议链接
 * 需求2:相互建议链接：开启服务端---客户端给服务器端发送：文本
 *      提示：start()   写逻辑
 * 网络通讯 Socket，具备方法，支持标准流
 *  客户端|服务端----Socket对象---调用方法
 *                           getInputStream() 获取输入流
 *                           getOutputStream() 获取输出流
 */
public class Client {
    /**客户端---网络连接类以及方法使用
     * Socket类  套接字     包位置：java.net
     * 作用:数据网络传输，底层采用TCP协议【发送数据形式：安全，慢】
     */
    //1.创建私有的Socket类---->作用域：全局，访问在当前Client类中
    private Socket socket;
    //2.创建Client构造器---实例化Socket
    public Client() {
        /**
         *实例化Socket
         *new Socket("IP地址“,"端口号”)
         *IP地址：找到目标主机
         *https://www.baidu.com/   一级域名
         *http://220.181.38.149/   实际访问地址：IP形式
         *本地IP：localhost    127.0.0.1
         *端口号：所有互联网型软件具备---软件大门
         *                           Mysql软件端口号：3306
         *                            网页默认端口号：80
         *    端口号通常代表形式：四个数值，表示对应软件
         *
         */
        try {
            socket = new Socket("192.168.130.187", 6666);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
    }
    //3.创建方法  start() 逻辑   使用IO流  传输数据
    public void start()  {
       //利用socket对象调用：标准流方法
        PrintWriter pw= null;
        //InputStream is = socket.getInputStream();
        //InputStreamReader isr=new InputStreamReader(is,UTF8);
        //BufferedReader br=new BufferedReader(isr);
        try {
            OutputStream os=null;
            os=socket.getOutputStream();
            //低级流----OutputStream【抽象父类】与FileOutputStream【子类】
            //高级流----转换流，目的：指定编码集  UTF8
            OutputStreamWriter osw=null;
            BufferedWriter bw=null;
            pw = null;
            osw=new OutputStreamWriter(os,"UTF8");
            //高级流---字符输出流，目的：高校数据传输---自带缓冲区：没有一次性推送

            bw=new BufferedWriter(osw);
            //高级流---PrintWriter，目的：输出一行行文本,第二次参数：true！没有一次性推送

            pw=new PrintWriter(bw,true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
        //客户端一直跟服务器端----说【循环】
        System.out.println("客户端用户：请输入文字");
        Scanner input=new Scanner(System.in);//测试--控制台输入文本
        while(true){//死循环---一直与服务器说话
            String say=input.nextLine();
            pw.println(say);  //写出  一行行文字
            System.out.println("写出完毕");
        }
//读入
       /* while(true){
         String str=br.readLine();
            System.out.println(""+str);
        }*/
    }
        //4.创建主方法---Client类运行
    public static void main(String[] args) throws IOException {
        //5.创建客户端类---默认构造器--调用实例化Socket：IP，端口
        Client client=new Client();
        //6.调用开始方法---传输数据：IO
        client.start();
    }
}
